package org.zoomdev.zoom.aop;

import org.zoomdev.zoom.common.utils.Classes;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

/**
 * 使用场景如下：
 * <p>
 * 比如一个对接某系统的http接口,可以将调用规则写在ProxyObject中
 * 而method上定义 annotation， 这样可以根据 annotation获取不同的参数，比如接口名称、接口参数、接口规则等等信息
 */
public interface ProxyFactory {
    static List<Method> getProxyMethods(Class<?> interfaceOrAbstractClass) {
        List<Method> methods = new ArrayList<>();
        for (Method method : Classes.findPublicMethods(interfaceOrAbstractClass)) {
            if (Modifier.isAbstract(method.getModifiers())) {
                methods.add(method);
            }
        }
        return methods;
    }

    /**
     * 动态代理 接口或者抽象类，抽象类不能有构造参数，否则系统并不知道如何构造本类的实例
     *
     * @param interfaceOrAbstractClass
     * @param object
     * @return
     */
    <T,C> T createObject(Class<T> interfaceOrAbstractClass, ProxyObject<C> object);


    /**
     * @param interfaceOrAbstractClass
     * @return
     */
    Class<?> createClass(Class<?> interfaceOrAbstractClass);

}
